#include <string.h>
#include <memory>
#include <thread>
#include <functional>
#include <stdio.h>
#include <iostream>
#include <unistd.h>

/*
 * 当前线程的 ID
 */

/*
 * 在内存中，整个 线程库 就像一个 “数组”，其中的一块块空间聚合排布 TCB 信息，而 每个 TCB 的起始地址就表示当前线程的 ID，
 * 地址是唯一的，因此线程 ID 也是唯一的。因此，我们之前打印 pthread_t 类型的 线程 ID 时，实际打印的是地址，
 * 不过是以 十进制 显示的，可以通过函数将地址转化为使用 十六进制 显示线程 ID 确实能转化为地址（虚拟进程地址空间上的地址）
 *
 * 注意： 即便是 C++11 提供的 thread 线程库，在 Linux 平台中运行时，也需要带上 -lpthread 选项，
 *        因为它本质上是对 原生线程库 的封装
 */

using namespace std;

string toHex(pthread_t t)
{
    char id[64];
    snprintf(id, sizeof(id), "0x%x", t);
    return id;
}

void *threadRun(void *arg)
{
    cout << "当前次线程的ID为 " << toHex(pthread_self()) << endl;
    return nullptr;
}

int main()
{
    pthread_t t;
    pthread_create(&t, nullptr, threadRun, nullptr);

    pthread_join(t, nullptr);
    cout << "创建的次线程ID为 " << toHex(t) << endl;

    cout << "我是[主线程]，ID是 " << toHex(pthread_self()) << endl;

    return 0;
}

#if 0
当前次线程的ID为 0xea27c700
创建的次线程ID为 0xea27c700
我是[主线程]，ID是 0xea27d740
#endif
